/**
 * 文件名：@THandlerMapping.java <br/>
 * 包名：cn.efunbox.afw.web.mvc.test.springmvc <br/>
 * 项目名：afw-web <br/>
 * @author xtwin <br/>
 */
package cn.efunbox.afw.web.mvc.test.springmvc;

import java.lang.reflect.Method;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerExecutionChain;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;

import cn.efunbox.afw.core.exception.AfwRuntimeException;
import cn.efunbox.afw.core.resolver.HandlerInfoResolver;

/**
 * 类名：THandlerMapping  <br />
 *
 * 功能：
 *
 * @author xtwin <br />
 * 创建时间：2015年12月9日 上午11:20:14  <br />
 * @version 2015年12月9日
 */
public class THandlerMapping extends RequestMappingHandlerMapping {
	
	// 处理器信息解析器
	private HandlerInfoResolver handlerInfoResolver;
	
	/**
	 * 功能: <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2015年12月9日 下午12:31:22<br/>
	 * 
	 * @param handler
	 * @param request
	 * @return <br/>
	 * @see org.springframework.web.servlet.handler.AbstractHandlerMapping#getHandlerExecutionChain(java.lang.Object, javax.servlet.http.HttpServletRequest)
	 */
	@Override
	protected HandlerExecutionChain getHandlerExecutionChain(Object handler, HttpServletRequest request) {
		HandlerExecutionChain chain = super.getHandlerExecutionChain(handler, request);
		
		try {
			List<?> stacks = handlerInfoResolver.resolve(handler).getTemplator().getStack();
			if (null != stacks && stacks.size() > 0) {
				for (Object interceptor : stacks) {
					chain.addInterceptor((HandlerInterceptor) interceptor);
				}
			}
		} catch (Exception e) {
			logger.error(e.getMessage(), e);
			
			throw new AfwRuntimeException(e.getMessage());
		}
		
		return chain;
	}

	/**
	 * 功能: <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2015年12月9日 上午11:20:39<br/>
	 * 
	 * @param handler
	 * @param method
	 * @return <br/>
	 * @see org.springframework.web.servlet.handler.AbstractHandlerMethodMapping#createHandlerMethod(java.lang.Object, java.lang.reflect.Method)
	 */
	@Override
	protected HandlerMethod createHandlerMethod(Object handler, Method method) {
		HandlerMethod handlerMethod = super.createHandlerMethod(handler, method);
		
		try {
			// 注册处理器
			handlerInfoResolver.registe(handlerMethod);
		} catch (Exception e) {
			throw new AfwRuntimeException("handlerInfo.resolve.error : " + e.getMessage());
		}
		
		return handlerMethod;
	}
}
